/**
 * 基于axios封装的请求模块
 */
import axios from 'axios';
import {
  interfaceUrl
} from '@/utils/publicUrl';
import {
  Message
} from 'element-ui';

// 创建请求对象
export const request = axios.create({
  baseURL: process.env.NODE_ENV === 'production'
    ? '/api'
    : '/api',
  timeout: 20000, // request timeout
  retry: 2,
  retryDelay: 1000,
})

// 通过插件机制获取到上下文对象（query、params、req、res、app、store···）
// 插件导出函数必须作为default成员
export default ({
  app,
  store,
  redirect
}) => {
  // 请求拦截器
  request.interceptors.request.use(
    config => {
      config.headers = {
        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
        linkRefer: app.router.currentRoute.fullPath,
        // 'Content-Type': 'application/json; charset=UTF-8'
        // 'Content-Type': 'text/html; charset=UTF-8'
      }
      if (config.method === 'post' && !config.noTrans) {
        if (config.headers['Content-Type'].includes('application/x-www-form-urlencoded')) {
          config.transformRequest = [function (data) {
            // 将数据拼接
            let ret = '';
            for (const it in data) {
              ret += encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&'
            }
            return ret;
          }];
        }
      }
      return config
    },
    error => {
      // do something with request error
      console.log(error) // for debug
      return Promise.reject(error)
    }
  )
  // response interceptor
  request.interceptors.response.use(
    response => {
      const res = response.data
      if (response.status !== 200) {
        return Promise.reject('网络错误，稍后再试！' || res.msg || 'error')
      } else {
        // 因每页都有获取消息 - 未登录时 - 去掉重定向到首页
        const isMessage = response.request.responseURL.includes('getMessage');
        switch (res.code) {
          case 1006: // 1006 已禁用
            Message.error(res.msg || '已禁用！');
            return Promise.reject(res.msg || '已禁用！');
          case 1007: // 1007 请注册
            Message.error(res.msg || '请注册！');
            store.dispatch('user/toggleModal', {
              register: true
            });
            return res
          case 1002: // 1002 未选择账户身份-》显示弹框
            // Message.error(res.msg || '请选择账户身份！');
            store.dispatch('user/toggleModal', {
              identity: true
            });
            return res
          case 1008: // 请登录
            if (!isMessage) {
              app.router.currentRoute.fullPath !== '/' && redirect('/')
              // Message.error(res.msg || '请登录！');
              store.dispatch('user/toggleModal', {
                login: true
              });
            }

            return res
          default:
            return res
        }
      }
    },
    error => {
      console.log('err' + error) // for debug
      Message.error(error);
      return Promise.reject(error)
    }
  )
}
